import { setBodyLoaded } from "@/framework/base-ui";
import App from "./App.vue";
import Vue from "vue";
import store, { AppModule, TagsViewModule, UserModule } from "./store";
import router from "./routers";
import { AsciiCode } from "@/framework/crypto";
import { hasViewFile } from "./routers/viewsInfo";
import { TagView, TagViewContentType } from "@/framework/tag-view";
import { CURRENT_BASE_URL, urlCombine } from "@/framework/utilities";

//#region router 拦截的处理;不直接放到 router 和 module 模块中，避免循环引用
// const whitePage = ["/"]; // 跳转时候的白名单
router.beforeEach(async (to, from, next) => {
  console.log("beforeEach", to.fullPath);
  // 判断如果是白名单中的页面，则直接跳转
  // if (whitePage.some(s => s.toLocaleLowerCase() === to.fullPath.toLocaleLowerCase())) {
  //   return next();
  // }
  if (to.path === "/") {
    next();
  } else if (to.fullPath.startsWith("/iframe/")) {
    // 如果访问的是iframe 的页面
    // 判断 viewStore 中有没有存储过这个页面的记录。（不存在则表示未访问过）
    if (await TagsViewModule.isVisitedView(to.fullPath)) {
      TagsViewModule.addIframeCachedView({
        id: AsciiCode(to.params.url),
        url: to.params.url,
      });

      next();
    } else {
      next({ replace: true, path: "/" });
    }
  } else if (to.fullPath.startsWith("/redirect/")) {
    next();
  } else if (to.fullPath.startsWith("/general/")) {
    // 判断权限是否存在，若存在，则跳转
    //TODO: 后续根据权限进行判断
    // eslint-disable-next-line
    if (true) {
      next();
    } else {
    }
    // const { hash } = to.params;
    // if (await TagsViewModule.isVisitedView("/general-" + hash)) {
    //   return next();
    // } else {
    //   return next({ replace: true, path: "/" });
    // }
  } else if (to.fullPath.startsWith("/general-")) {
    // 判断这个页面是否访问过，没访问过的话应该跳转首页
    if (await TagsViewModule.isVisitedView(to.path)) {
      // 判断如果当前访问的地址和即将访问的地址是同一个，则停止后续处理
      if (router.currentRoute.path === to.path) {
        next(false);
      } else if (router.getRoutes().some(s => s.path === to.path)) {
        // 有可能这个时候正好做了下刷新浏览器的动作，所以这种情况下是需要重新进行添加路由的操作
        next();
      } else {
        next({ replace: true, path: "/general/" + to.path.split("-")[1] });
      }
    } else {
      next({ replace: true, path: "/" });
    }
  } else if (hasViewFile(to.path)) {
    // 判断是否存在对应页面的文件
    const url = new URL(to.fullPath, location.origin);
    url.pathname = url.pathname.toLocaleLowerCase(); // 路径统一转小写
    const newPath = AsciiCode(url.pathname + url.search + url.hash);

    next({ replace: true, path: "/general-" + newPath + url.search + url.hash });
  } else {
    // eslint-disable-next-line
    alert("模块不存在或正在开发中");
    // alert("访问的页面不存在");
    next(false);
  }
});

router.afterEach(to => {
  if (!to.fullPath.startsWith("/redirect/") && !to.fullPath.startsWith("/general/")) {
    const component = to.matched[0].components.default; // 取出组件实例
    if (component) {
      // 如果组件返回的是个函数，则应该从options 中取name 值，否则为object 则直接取name 值
      const componentName = typeof component === "function" ? (component as any).options.name : (component as any).name;
      // 将页面组件添加到缓存
      if (componentName) {
        // debugger;
        TagsViewModule.addCachedView(componentName);

        if (to.fullPath.startsWith("/general-")) {
          TagsViewModule.activeView({
            path: to.path,
            componentName,
          });
        } else {
          // TODO 后续需要增加判断
          TagsViewModule.activeView({
            path: to.fullPath,
            componentName,
          });
        }
      }
    }
  }
});
// #endregion

// 初始化默认显示的菜单项目
if (!TagsViewModule.hasVisitedViews) {
  AppModule.defaultDisplayMenus.forEach(menu => {
    const fixedView = new TagView();
    fixedView.isFixed = true;
    fixedView.title = menu.name;
    // fixedView.order = menu.order;
    fixedView.url = menu.url;
    fixedView.type = TagViewContentType.VueInstance;
    fixedView.icon = menu.icon;
    TagsViewModule.tryAddView(fixedView);
  });
}
// 判断是否存在首页，如果不存在，则不应继续，否则会出现无限循环的情况
if (AppModule.homeMenu) {
  // 首次进入页面的时候去指定首页
  router.addRoute({
    path: "/",
    redirect: AppModule.homeMenu.url,
  });
} else {
  location.replace(urlCombine(CURRENT_BASE_URL, "Failed.html"));
}

new Vue({
  router,
  store,
  render: h => h(App),
  async mounted() {
    await Vue.nextTick();
    setBodyLoaded();
  },
}).$mount("#app");
